//
//  main.m
//  递归01
//
//  Created by szcq on 2021/4/14.
//

#import <Foundation/Foundation.h>
#import <stdio.h>


/**
 系统默认会传入一个参数  为当前文件所在的地址，
 如果自己定义传递参数则
    1、打开Arguments菜单  快捷键 command + shift + <
    2、在Arguments Passed  On Launch 的下方点击 “+”号  数据即可  如输入 Jackie
                输出结果为
                        argc == 2
                        Jackie
                        /Users/xxxxxx/Build/Products/Debug/递归01
 
 */



void caculaterAnyNumberSun(void);

/// 函数的主入口
/// @param argc 系统传给C  参数的个数
/// @param argv 参数的值
int main(int argc, const char * argv[]) {
    
//    printf("argc == %d\n",argc);
//    while(argc){
//        printf("%s\n", argv[--argc]);
//    }
    
    caculaterAnyNumberSun();
    
    
    return 0;
}

int sum(int);
/**
 用递归思想计算  0 到 任意整数的和
 */
void caculaterAnyNumberSun() {
    int number = 0;
    printf("请输入一个数\n");
    scanf("%d",&number);
    printf("number == %d\n",number);
    
    int result = sum(number);
    printf("result == %d\n",result);
}

/**
 递归思想
    1、必须有一个明确的结束条件，否则会陷入死循环
    2、递归比较消耗性能，会一直给函数开辟内存，知道不满足循环条件
    3、递归有两条循环
            3.1 正循环不断调用函数，直到不满足递归条件（在调用函数的时候，会不停的将上一次return的函数当做参数传递，进行下一次递归，依次往复）
            3.2当递归到不满度循环条件时，会将此时的  result = 0 赋值给 上一次递归时传进来的函数  即sum(n - 1) ，即sum(1 - 1)  == 0，0 + 1，此时result = 1，又会将result = 1  赋值给上一次传递的函数 sum(n - 1) ，即 1 + 2 = 3，此时result = 3，又会将result = 3  赋值给上一次传递的函数 sum(n - 1) ，3 + 3 = 6，此时result = 6，又会将result = 6 赋值给上一次传递的函数 sum(n - 1)  = 6；6+ 4，即 sum(4 - 1) + 4 = 10，
 */

/// 递归
/// @param n 值
int sum(int n){
    int result = 0;
    if (n < 1) {
        result = 0;
    } else {
        int addStep = sum(n - 1);// 不断的循环调用该函数，如果没有明确的结束条件会陷入死循环
        result = addStep + n;
    }
    return result;
}
